package vpc2vpc;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeRegionsResult;
import com.amazonaws.services.ec2.model.Region;
import com.amazonaws.services.ec2.model.RouteTable;
import com.amazonaws.services.ec2.model.Subnet;
import com.amazonaws.services.ec2.model.Vpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
/**
* VPCHelper
*
* @author Vinay Selvaraj
*/
public class VPCHelper {
private Logger LOG = Logger.getLogger(VPCHelper.class);
private static VPCHelper instance;
private VPCHelper() {
}
public static VPCHelper getInstance() {
if (instance == null) {
instance = new VPCHelper();
}
return instance;
}
public List<Vpc> listVpcs(AWSCredentials awsCreds) {
List<Vpc> vpcs = new ArrayList();
HashMap<Region, List> regionVpcMap = listRegionVpcs(awsCreds);
for (List<Vpc> regionVpcs : regionVpcMap.values()) {
vpcs.addAll(regionVpcs);
}
return vpcs;
}
public HashMap<Region, List> listRegionVpcs(AWSCredentials awsCreds) {
AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds);
List<Region> regions = new ArrayList();
DescribeRegionsResult descRegionsResult = ec2Client.describeRegions();
if (descRegionsResult != null) {
regions = descRegionsResult.getRegions();
}
HashMap<Region, List> regionVpcs = new HashMap();
ExecutorService listVPCExecutor = Executors.newFixedThreadPool(8);
for (Region region : regions) {
List<Vpc> vpcs = new ArrayList();
regionVpcs.put(region, vpcs);
Runnable worker = new ListVPCRunnable(awsCreds, region, vpcs);
listVPCExecutor.execute(worker);
}
listVPCExecutor.shutdown();
try {
listVPCExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
LOG.error("Caught InterruptedException: " + e.getMessage());
}
return regionVpcs;
}
public List<Subnet> listSubnets(AWSCredentials awsCreds) {
List<Subnet> subnets = new ArrayList();
HashMap<Region, List> regionSubnetMap = listRegionSubnets(awsCreds);
for (List<Subnet> regionSubnets : regionSubnetMap.values()) {
subnets.addAll(regionSubnets);
}
return subnets;
}
public HashMap<Region, List> listRegionSubnets(AWSCredentials awsCreds) {
AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds);
List<Region> regions = new ArrayList();
DescribeRegionsResult descRegionsResult = ec2Client.describeRegions();
if (descRegionsResult != null) {
regions = descRegionsResult.getRegions();
}
HashMap<Region, List> regionSubnetsMap = new HashMap();
ExecutorService listSubnetExecutor = Executors.newFixedThreadPool(8);
for (Region region : regions) {
List<Subnet> subnets = new ArrayList();
regionSubnetsMap.put(region, subnets);
Runnable worker = new ListSubnetRunnable(awsCreds, region, subnets);
listSubnetExecutor.execute(worker);
}
listSubnetExecutor.shutdown();
try {
listSubnetExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
LOG.error("Caught InterruptedException: " + e.getMessage());
}
return regionSubnetsMap;
}
public HashMap<Region, List> listRegionRouteTables(AWSCredentials awsCreds) {
AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds);
List<Region> regions = new ArrayList();
DescribeRegionsResult descRegionsResult = ec2Client.describeRegions();
if (descRegionsResult != null) {
regions = descRegionsResult.getRegions();
}
HashMap<Region, List> regionRouteTablesMap = new HashMap();
ExecutorService listRouteTablesExecutor = Executors.newFixedThreadPool(8);
for (Region region : regions) {
List<RouteTable> routeTables = new ArrayList();
regionRouteTablesMap.put(region, routeTables);
Runnable worker = new ListRouteTableRunnable(awsCreds, region, routeTables);
listRouteTablesExecutor.execute(worker);
}
listRouteTablesExecutor.shutdown();
try {
listRouteTablesExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
LOG.error("Caught InterruptedException: " + e.getMessage());
}
return regionRouteTablesMap;
}
}
class ListVPCRunnable implements Runnable {
private Logger LOG = Logger.getLogger(ListVPCRunnable.class);
private AmazonEC2Client ec2Client;
private Region region;
private List<Vpc> vpcs;
public ListVPCRunnable(AWSCredentials awsCreds, Region region, List<Vpc> vpcs) {
this.region = region;
this.vpcs = vpcs;
ec2Client = new AmazonEC2Client(awsCreds);
ec2Client.setEndpoint(region.getEndpoint());
LOG.debug("Set endpoint to " + region.getEndpoint());
}
public void run() {
LOG.debug("Running describeVpcs() in " + region.getRegionName());
vpcs.addAll(ec2Client.describeVpcs().getVpcs());
LOG.debug("Completed describeVpcs() in " + region.getRegionName());
}
}
class ListSubnetRunnable implements Runnable {
private Logger LOG = Logger.getLogger(ListSubnetRunnable.class);
private AmazonEC2Client ec2Client;
private Region region;
private List<Subnet> subnets;
public ListSubnetRunnable(AWSCredentials awsCreds, Region region, List<Subnet> subnets) {
this.region = region;
this.subnets = subnets;
ec2Client = new AmazonEC2Client(awsCreds);
ec2Client.setEndpoint(region.getEndpoint());
LOG.debug("Set endpoint to " + region.getEndpoint());
}
public void run() {
LOG.debug("Running describeSubnets() in " + region.getRegionName());
subnets.addAll(ec2Client.describeSubnets().getSubnets());
LOG.debug("Completed describeSubnets() in " + region.getRegionName());
}
}
class ListRouteTableRunnable implements Runnable {
private Logger LOG = Logger.getLogger(ListRouteTableRunnable.class);
private AmazonEC2Client ec2Client;
private Region region;
private List<RouteTable> routeTables;
public ListRouteTableRunnable(AWSCredentials awsCreds, Region region, List<RouteTable> routeTables) {
this.region = region;
this.routeTables = routeTables;
ec2Client = new AmazonEC2Client(awsCreds);
ec2Client.setEndpoint(region.getEndpoint());
LOG.debug("Set endpoint to " + region.getEndpoint());
}
public void run() {
LOG.debug("Running describeRouteTables() in " + region.getRegionName());
routeTables.addAll(ec2Client.describeRouteTables().getRouteTables());
LOG.debug("Completed describeRouteTables() in " + region.getRegionName());
}
}